package com.fulin.sycnLife;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class SimpleHttpServer {
	public static void main(String[] args) throws Exception {
		basePath = ".";
		start();
	}
	
	
	//处理HttpRequest的线程池
	static ThreadPool<HttpRequestHandler> threadPool = new DefaultThreadPool<HttpRequestHandler>(1);
//	static ExecutorService threadPool = Executors.newFixedThreadPool(2);
	
	//SimpleHttpServer的根路径
	static String basePath;
	static ServerSocket serverSocket;
	static int port = 8080;
	public static void setPort(int port){
		if(port > 0){
			SimpleHttpServer.port = port;
		}
	}
	
	public static void setBasePath(String basePath){
		if(basePath != null && new File(basePath).exists() && new File(basePath).isDirectory()){
			SimpleHttpServer.basePath = basePath;
		}
	}
	
	//启动SimpleHtpServer
	public static void start() throws Exception{
		serverSocket = new ServerSocket(port);
		Socket socket = null;
		while((socket = serverSocket.accept()) != null){
			//接收一个客户端Socket,生成一个HttpRequestHandler,放入线程池执行
			threadPool.execute(new HttpRequestHandler(socket));
		}
		serverSocket.close();
	}
	
	static class HttpRequestHandler implements Runnable{
		
		private Socket socket;
		public HttpRequestHandler(Socket socket){
			this.socket = socket;
		}
		
		@Override
		public void run() {
			String line = null;
			BufferedReader br = null;
			BufferedReader reader = null;
			PrintWriter out = null;
			InputStream in = null;
			try{
				reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
				String header = reader.readLine();
				System.out.println("header : "+header);
				//由相对路径计算出绝对路径
				String filePath = basePath + header.split(" ")[1];
				System.out.println("filePath : "+filePath);
				out = new PrintWriter(socket.getOutputStream());
				//如果请求资源的后缀是jpg或者ico,则读取资源并输出
				if(filePath.endsWith("jpg") || filePath.endsWith("ico")){
					in = new FileInputStream(filePath);
					ByteArrayOutputStream baos = new ByteArrayOutputStream();
					int i = 0;
					while((i = in.read()) != -1){
						baos.write(i);
					}
					byte[]	array = baos.toByteArray();
					out.println("HTTP/1.1 200 OK");
					out.println("Server: Molly");
					out.println("Content-Type: image/jpeg");
					out.println("Content-Length: " + array.length);
					out.println("");
					socket.getOutputStream().write(array,0,array.length);
					
				}else{
					br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath)));
					out = new PrintWriter(socket.getOutputStream());
					out.println("HTTP/1.1 200 OK");
					out.println("Server: Molly");
					out.println("Content-Type: text/html; charset=UTF-8");
					out.println("");
					while((line = br.readLine()) != null){
						System.out.println(line);
						out.println(line);
					}
				}
				out.flush();
			}catch(Exception ex){
				out.println("HTTP/1.1 500");
				out.println("");
				out.flush();
			}finally{
				close(br,in,reader,out,socket);
			}
			
		}
	}
	
	//关闭流或者Socket
	private static void close(Closeable... closeables){
		if(closeables != null){
			for(Closeable closeable : closeables){
				try{
					closeable.close();
				}catch(Exception ex){}
			}
		}
	}
}
